package io.gitee.yth.design.pattern.test.core.pattern.creational.singleton;

/**
 * 7) 静态内部类
 * <p>
 * 外部类Singleton7被装载时，内部类SingletonInstance不会立刻被装载，达到lazy loading
 * <p>
 * 类的装载是线程安全的
 *
 * @author yth
 * @since 2023-04-16-20:42
 */
public class Singleton7 {

    /**
     * 类的加载：加载+链接（验证+准备+解析）+初始化
     * <p>
     * 当外部类（Singleton7）参与类的加载时，
     * 内部类（SingletonInstance）在外部类解析阶段被调用类的加载，
     * 但是内部类还没有初始化
     * <p>
     * 什么时候初始化？
     * 字节码指令：new、getstatic、putstatic、invokestatic
     * <p>
     * 为什么类的加载是线程安全的？
     * ClassLoader类的loadClass()方法中使用了
     * synchronized (getClassLoadingLock(name))
     * getClassLoadingLock方法中，使用concurrentHashMap<ClassName:String, Lock:Object>
     * 加载类之前会检查这个类是不是已经被加载，如果被加载了就不需要再加载了，检查的方法是native方法
     */
    private static class SingletonHolder {
        private static final Singleton7 INSTANCE = new Singleton7();
    }

    public static Singleton7 getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private Singleton7() {
    }

}
